package com.ruoyi.psi.sale.order.service;


import com.ruoyi.produce.report.produceAnalysis.domain.ProduceAnalysis;
import com.ruoyi.psi.sale.delivery.domain.SaleOrderDeliveryTotal;
import com.ruoyi.psi.sale.delivery.domain.SaleOrderProductionDeliveryTotal;
import com.ruoyi.psi.sale.order.BI.*;
import com.ruoyi.psi.sale.order.domain.*;

import java.sql.Timestamp;
import java.util.List;

/**
 * 销售订单
 * 业务层
 */
public interface ISaleOrderService {
    /**
     * 销售订单查询
     *
     * @param cond
     * @return
     */
    List<SaleOrderDto> selectSaleOrderList(SaleOrderCond cond);
    List<SaleOrderDto> selectSaleOrderByUsername(SaleOrderCond cond);

    /**
     * 按编号查询
     *
     * @param saleOrderId 销售订单编号
     * @return
     */
    SaleOrderDto selectSaleOrderById(String saleOrderId);

    /**
     * 销售订单新增
     *
     * @param saleOrder
     * @return
     */
    int insertSaleOrder(SaleOrderDomain saleOrder) throws Exception;

    /**
     * 销售订单更新
     *
     * @param saleOrder
     * @return
     */
    int updateSaleOrder(SaleOrderDomain saleOrder) throws Exception;

    /**
     * 更新销售订单删除标志位
     *
     * @param saleOrder
     * @return
     */
    int updateSaleOrderDeleteFlag(SaleOrderDomain saleOrder);

    /**
     * 销售订单详细查询
     *
     * @return
     */
    List<SaleOrderListDto> selectSaleOrderListList(SaleOrderCond cond);

    /**
     * 查询销售订单对应的所有产品详细
     *
     * @param saleOrderId 销售订单编号
     * @return
     */
    List<SaleOrderListDto> selectSaleOrderListListById(String saleOrderId);

    /**
     * 查询销售订单对应的指定产品详细
     *
     * @param saleOrderId
     * @return
     */
    SaleOrderListDto selectSaleOrderListById(String saleOrderId, String produceId);
    SaleOrderListDto  selectSaleOrderListOnlyById(String saleOrderId);
    /**
     * 查询业务员排行
     *
     * @return
     */
    List<Salesman> selectSalesman(SaleOrderCond cond);

    /**
     * 查询订单利润排行
     *
     * @param cond
     * @return
     */
    List<SaleOrderProfit> selectSaleOrderProfit(SaleOrderCond cond);

    /**
     * 查询月销售目标达成情况
     *
     * @param cond
     * @return
     */
    List<SaleTargetAchievement> selectSaleTargetAchievement(SaleOrderCond cond);

    /**
     * 查询订单处理周期
     *
     * @param cond
     * @return
     */
    List<OrderProcessingCycle> selectOrderProcessingCycle(SaleOrderCond cond);

    /**
     * 查询订单生产周期
     *
     * @param cond
     * @return
     */
    List<OrderProductionCycle> selectOrderProductionCycle(SaleOrderCond cond);

    /**
     * 查询订单采购周期
     *
     * @param cond
     * @return
     */
    List<OrderPurchaseCycle> selectOrderPurchaseCycle(SaleOrderCond cond);

    /**
     * 查询订单发货周期
     *
     * @param cond
     * @return
     */
    List<OrderDeliveryCycle> selectOrderDeliveryCycle(SaleOrderCond cond);

    /**
     * 查询超期订单
     *
     * @param cond
     * @return
     */
    List<SaleOrderDto> selectOverdueOrder(SaleOrderCond cond);

    /**
     * 查询订单成本
     *
     * @param saleOrderId
     * @return
     */
    List<SaleOrderCost> selectSaleOrderCost(String saleOrderId);

    /**
     * 查询销售订单数量
     *
     * @return
     */
    List<SaleOrderQuantity> selectSaleOrderQuantity();

    /**
     * 查询客户订单
     *
     * @param cond
     * @return
     */
    List<CustomerOrder> selectCustomerOrder(SaleOrderCond cond);

    /**
     * 查询对应的销售订单在销售出库中的出库数量
     *
     * @param saleOrderId
     * @return
     */
    SaleOrderDeliveryTotal selectSaleOrderTotal(String saleOrderId);

//    /**
//     * 查询对应的销售订单在销售出库中的出库金额
//     * @param cond
//     * @param saleOrderId
//     * @return
//     */
//    double selectSaleOrderPriceTotal(SaleDeliveryCond cond, String saleOrderId);

    /**
     * 查询销售订单中该产品的出库数量
     *
     * @param saleOrderId
     * @param produceId
     * @return
     */
    SaleOrderProductionDeliveryTotal selectSaleProductionDeliveryTotal(String saleOrderId, String produceId);

//    /**
//     * 查询销售订单中该产品的出库金额
//     * @param cond
//     * @param saleOrderId
//     * @param produceId
//     * @return
//     */
//    double selectSaleProductionDeliveryPrice(SaleDeliveryCond cond, String saleOrderId, String produceId);

    /**
     * 销售订单查询
     * BI模块使用，不计算出库数量
     *
     * @param cond
     * @return
     */
    List<SaleOrderDto> selectSaleOrderListForBI(SaleOrderCond cond);

    /**
     * 查询产品订单数
     *
     * @return
     */
    List<SaleOrderProduct> selectProductOrderMonth();

    /**
     * 查询产品订单数
     *
     * @return
     */
//    List<SaleOrderProduct> selectProductOrderMonth2(List<SaleOrderProduct> saleOrderProductList);

    /**
     * 通过销售订单查询销售订单进度
     * 1-未准备
     * 2-采购中
     * 3-生产加工中
     * 4-出库
     * @param saleOrderId
     * @return
     */
    int querySaleOrderProgress(String saleOrderId);

    List<SaleOrderDto> selectOrderByName(String produceName);
}
